"""日志工具模块

基于loguru提供统一的日志配置和管理功能。
"""

import sys
from pathlib import Path
from typing import Optional, Union
from loguru import logger


class Logger:
    """基于loguru的日志管理器"""

    _configured = False

    @classmethod
    def configure(
            cls,
            level: str = "INFO",
            log_file: Optional[str] = None,
            rotation: str = "10 MB",
            retention: str = "7 days",
            format_string: Optional[str] = None
    ):
        """配置loguru日志记录器
        
        Args:
            level: 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
            log_file: 日志文件路径（可选）
            rotation: 日志轮转大小
            retention: 日志保留时间
            format_string: 自定义格式字符串
        """
        if cls._configured:
            return

        # 移除默认处理器
        logger.remove()

        # 默认格式
        if format_string is None:
            format_string = (
                "<green>{time:YYYY-MM-DD HH:mm:ss}</green> | "
                "<level>{level: <8}</level> | "
                "<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - "
                "<level>{message}</level>"
            )

        # 添加控制台处理器
        logger.add(
            sys.stdout,
            format=format_string,
            level=level,
            colorize=True
        )

        # 添加文件处理器（如果指定了日志文件）
        if log_file:
            log_path = Path(log_file)
            log_path.parent.mkdir(parents=True, exist_ok=True)
            
            logger.add(
                log_file,
                format=format_string,
                level=level,
                rotation=rotation,
                retention=retention,
                encoding="utf-8",
                colorize=False
            )

        cls._configured = True

    @classmethod
    def get_logger(cls, name: str = None):
        """获取loguru日志记录器
        
        Args:
            name: 日志记录器名称（loguru中主要用于上下文）
            
        Returns:
            loguru logger实例
        """
        if not cls._configured:
            cls.configure()
        
        if name:
            return logger.bind(name=name)
        return logger


# 便捷函数
def get_logger(name: str = None):
    """获取loguru日志记录器的便捷函数
    
    Args:
        name: 日志记录器名称
        
    Returns:
        配置好的loguru logger
    """
    return Logger.get_logger(name)


def setup_logging(
        level: str = "INFO",
        log_file: Optional[str] = None,
        rotation: str = "10 MB",
        retention: str = "7 days",
        format_string: Optional[str] = None
):
    """设置应用程序日志的便捷函数
    
    Args:
        level: 日志级别
        log_file: 日志文件路径（可选）
        rotation: 日志轮转大小
        retention: 日志保留时间
        format_string: 自定义格式字符串
    """
    Logger.configure(level, log_file, rotation, retention, format_string)


# 直接导出loguru的logger实例，方便使用
__all__ = ['logger', 'get_logger', 'setup_logging', 'Logger']
